home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of Video
/
World of Video.iso
/
gfxprograms
/
3dprograms
/
rayshade-4.0
/
fixes
/
fix009
< prev
next >
Wrap
Internet Message Format
|
1995-02-13
|
6KB
From theseas!fs.Princeton.EDU!cek Sat, 8 May 93 01:34:11 EET
Received: by kriton.UUCP (V1.16/Amiga)
id AA00000; Sat, 8 May 93 01:34:11 EET
Received: by theseas.ntua.gr with UUCP; Fri, 7 May 93 14:46:34 +0300
Received: from mcsun.EU.net by pythia.ics.forth.gr via ITEnet with SMTP;
id AA05390 (5.65c/FORTH-ICS-3.0-MHS-7.0); Fri, 7 May 1993 14:42:23 +0300
Received: by mcsun.EU.net via EUnet
id AA25040 (5.65b/CWI-2.217); Fri, 7 May 1993 13:37:20 +0200
Received: from Princeton.EDU by relay1.UU.NET with SMTP
(5.61/UUNET-internet-primary) id AB16762; Fri, 7 May 93 07:36:31 -0400
Received: from fs.Princeton.EDU by Princeton.EDU (5.65b/2.96/princeton)
id AA05481; Fri, 7 May 93 07:36:25 -0400
Received: by fs.Princeton.EDU (4.1/1.105)
id AA25196; Fri, 7 May 93 07:36:24 EDT
Received: from pobox.cscs.ch by fs.Princeton.EDU (4.1/1.105)
id AA25110; Fri, 7 May 93 07:35:39 EDT
Received: from staff-fddi.cscs.ch by pobox.cscs.ch with SMTP inbound
id <5598-0@pobox.cscs.ch>; Fri, 7 May 1993 13:35:28 +0200
Received: from localhost by staff-ether id AA28928; Fri, 7 May 93 13:35:23 +0200
Message-Id: <9305071135.AA28928@staff-ether>
Date: Fri, 07 May 93 13:35:22 +0200
Errors-To: Princeton.EDU!cek
Remailed-Date: Fri May 7 07:35:43 EDT 1993
From: cscs.ch!athurn
To: cs.Princeton.EDU!rayshade-users
Subject: Portable Heighfields (patch)
Hello Rayshade Users:
I finally got around to solving the heightfield portability problem.
The following patch is to be applied to libray/libobj/hf.c. After
recompilation (see notes below), Rayshade and Inetray expect the
heightfield data files to be XDR files (eXternal Data Representation -
the stuff SUN uses for RPC and therefore NFS). Compared to a binary
file, there is a 40 byte overhead but the XDR file is completely
portable.
Just patching hf.c and recompiling doesn't change anything. To compile
the new stuff -DXDRHF has to be added to the ccflags in config.sh (and
then Reconfigure has to be run). On some machines (e.g. SGI)
the library containing the xdr-routines have to be added (in the case of
of SGI they reside in libsun.a). Furthermore the compiler has to be
instructed to handle non-ansi c since the SUN header files are not (yet)
ansi clean (on the SGI -cckr has to be added to the ccflags).
The patch has been tested on SGIs and on a DECstation (which has
different byte ordering).
Following the patch is a short c program (hf2xhf) which converts
old-style binary hf files to the new xhf (XDR heightfield) files.
Cheers
- ant
============= patch.hf.c ================================================
25a26,30
> #ifdef XDRHF
> #include <rpc/rpc.h>
> #include <fcntl.h>
> #define MAXSIZE ((u_int)1000000)
> #endif
48a54,61
> #ifdef XDRHF
> readbuf(fdp,buf,count)
> int *fdp; void *buf; u_int count;
> {
> return read(*fdp,buf,count);
> }
> #endif
>
53,56c66,76
< Hf *hf;
< FILE *fp;
< float val, *maxptr, *minptr;
< int i, j;
---
> Hf *hf;
> float val, *maxptr, *minptr;
> int i, j;
> #ifdef XDRHF
> static int fp;
> u_int sqSize;
> XDR xdrs;
> float *buf;
> #else
> FILE *fp;
> #endif
57a78,80
> #ifdef XDRHF
> if ((fp = open(filename,O_RDONLY)) < 0) {
> #else
59a83
> #endif
76a101,105
> #ifdef XDRHF
> xdrrec_create(&xdrs,0,0,&fp,readbuf,NULL);
> xdrs.x_op = XDR_DECODE;
> if (!xdrrec_skiprecord(&xdrs)) {
> #else
77a107
> #endif
81a112,120
> #ifdef XDRHF
> buf = NULL;
> if (!xdr_array(&xdrs,&buf,&sqSize,MAXSIZE,
> (u_int)sizeof(float),xdr_float)) {
> RLerror(RL_ABORT, "xdr_array() failed.\n");
> return (Hf *)NULL;
> }
> hf->size = (int)sqrt((double)sqSize);
> #endif
83a123,125
> #ifdef XDRHF
> hf->data[i] = &buf[i*hf->size];
> #else
84a127
> #endif
87a131
> #ifndef XDRHF
92a137
> #endif
108a154,156
> #ifdef XDRHF
> (void)close(fp);
> #else
109a158
> #endif
============= end of patch.hf.c =====================================
/*======================================================================
H F 2 X H F . C
doc: Fri Apr 30 11:27:46 1993
dlm: Fri May 7 11:22:17 1993
(c) 1993 ant@bernina.ethz.ch
uE-Info: 58 40 T 0 0 72 2 2 4 ofnI
======================================================================*/
#include <stdio.h>
#include <fcntl.h>
#include <rpc/rpc.h>
#define int32 int
#define float32 float
#define USE_DEFAULT 0
static int ofd; /* could also be passed */
main(ac,av)
int ac; char *av[];
{
int ifd,i,writebuf();
int32 size;
u_int sqSize;
float32 val,*array;
XDR xdrs;
if (ac != 3) {
fprintf(stderr,"Usage: %s <infile> <outfile>\n",av[0]);
exit(1);
}
if ((ifd = open(av[1],O_RDONLY)) < 0) {
perror("open infile");
exit(1);
}
read(ifd,&size,4);
printf("HF size = %d\n",size);
sqSize = size*size;
array = (float32 *)malloc(sqSize*sizeof(float32));
if (array == NULL) {
fprintf(stderr,"malloc() failed!\n");
exit(1);
}
for (i=0; i<sqSize; i++) {
read(ifd,&val,4);
array[i] = (float32)val;
}
close(ifd);
if ((ofd = creat(av[2],0666)) < 0) {
perror("open outfile");
exit(1);
}
xdrrec_create(&xdrs,USE_DEFAULT,USE_DEFAULT,NULL,NULL,writebuf);
xdrs.x_op = XDR_ENCODE;
if (!xdr_array(&xdrs,&array,&sqSize,sqSize,
(u_int)sizeof(float32),xdr_float)) {
fprintf(stderr,"xdr_array() failed!\n");
exit(1);
}
if (!xdrrec_endofrecord(&xdrs,TRUE)) {
fprintf(stderr,"xdr_endofrecord() failed!\n");
exit(1);
}
close(ofd);
exit(0);
}
writebuf(dummyParam,buf,count) /* write stub */
char *dummyParam,*buf; int count;
{
return write(ofd,buf,count);
}
----------
Administrivia: rayshade-request@cs.princeton.edu
Mailing list: rayshade-users@cs.princeton.edu